﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using Microsoft.Security.Application;
using System.Security.Cryptography;
using System.Globalization;

#pragma warning disable 0618 // disable AntiXX is obsolete warning

public partial class VluchtOverzicht : System.Web.UI.Page
{

    int kosten = 0;
    int beschikbareMiles = 0;
    int luchthavenNr;
    int bestemmingNr;
    int klantNr;
    int vluchtNr;
    string email;

    protected void Page_Load(object sender, EventArgs e)
    {
        // Gegevens uit de vluchtsessies ophalen
        if (Session["heenVlucht"] != null)
        {
            Vlucht v = (Vlucht)Session["heenVlucht"];
            laadHeenVluchtGegevens(v);
        }
        else Response.Redirect("VluchtBoeken.aspx");

        if (Session["retourVlucht"] != null)
        {

            Vlucht v = (Vlucht)Session["retourVlucht"];
            lbl_retour_datum.Text = v.DatumVertrek.Day + "/" + v.DatumVertrek.Month + "/" + v.DatumVertrek.Year;
            lbl_retour_tijd.Text = v.TijdVluchtHeen.ToString();
        }

        // Indien geen retour vlucht aanwezig, UI elementen omzichtbaar maken
        else if (Session["retourVlucht"] == null)
        {
            lbl_retour_datum.Visible = false;
            lbl_retour_tijd.Visible = false;
            lbl_retour_datum_tekst.Visible = false;
            lbl_retour_tijd_tekst.Visible = false;
        }

        // Indien aanwezig gegevens uit de gebruikerscookie halen, anders de UI elementen verbergen
        // en bestelknop disabelen.
        if (Request.Cookies["InHollandAir"] != null)
        {
            maakGegevensZichtbaar(true);
            toonPersoonsgegevens();
        }
        else if (Request.Cookies["InHollandAir"] == null)
            maakGegevensZichtbaar(false);

        // Totaalkosten voor de vlucht berekenen
        voerAantalMilesIn();

        if (kosten > beschikbareMiles)
        {
            btn_boek_vlucht.Enabled = false;
            lbl_foutmelding.Text = Fout.onvoldoendeSaldo;
        }
        if (Request.Cookies["InHollandAir"] == null)
        {
            lbl_foutmelding.Text = Fout.eerstInloggen;
        }


    }

    private void toonPersoonsgegevens()
    {
        // Cookie decrypten en sessie ID uit de cookie vergelijken met die in de database.
        try
        {
            string sessionid = Request.Cookies["InHollandAir"]["1"];
            if (ConnectDB._Connection.State == ConnectionState.Open)
                ConnectDB._Connection.Close();
            ConnectDB._Connection.Open();
            cmd = new SqlCommand(sp.getKlantGegevens, ConnectDB._Connection);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter session = cmd.Parameters.Add("@sessionid", SqlDbType.VarChar);

            session.Value = sessionid;
            reader = cmd.ExecuteReader();

            printPersoonsGegevens();
        }

        catch (SqlException e)
        {
            lbl_foutmelding.Text = Fout.onvoldoendeSaldo;
            LogError.writeToLogFile(e.Message);
        }
        finally {
            reader.Close();
            ConnectDB._Connection.Close();
        }

    }

    public void printPersoonsGegevens()
    {

        // klantnummer lokaal opslaan en andere gegevens tonen aan de gebruiker
        while (reader.Read())
        {
            klantNr = int.Parse(reader["Klantnummer"].ToString());
            lbl_naam.Text = AntiXss.HtmlEncode(reader["Voornaam"].ToString()) + " " + AntiXss.HtmlEncode(reader["Tussenvoegsel"].ToString()) + " " + AntiXss.HtmlEncode(reader["Achternaam"].ToString());
            lbl_adres.Text = AntiXss.HtmlEncode(reader["Straatnaam"].ToString()) + " " + AntiXss.HtmlEncode(reader["Huisnummer"].ToString());
            lbl_postcode.Text = AntiXss.HtmlEncode(reader["Postcode"].ToString());
            lbl_woonplaats.Text = AntiXss.HtmlEncode(reader["Plaats"].ToString());
            lbl_beschikbare_miles.Text = AntiXss.HtmlEncode(reader["InHollandMiles"].ToString());
            
            beschikbareMiles = int.Parse(reader["InHollandMiles"].ToString());
            email = reader["Emailadres"].ToString();

        }
    }

    private void maakGegevensZichtbaar(bool swap)
    {
        // Gegevens zichtbaar of onzichtbaar maken afhankelijk van Cookie
        lbl_naam_tekst.Visible = swap;
        lbl_naam.Visible = swap;
        lbl_postcode_tekst.Visible = swap;
        lbl_postcode.Visible = swap;
        lbl_woonplaats_tekst.Visible = swap;
        lbl_woonplaats.Visible = swap;
        lbl_adres_tekst.Visible = swap;
        lbl_adres.Visible = swap;
        lbl_beschikbare_miles.Visible = swap;
        lbl_beschikbare_miles_tekst.Visible = swap;
        //   btn_boek_vlucht.Enabled = swap;
        lbl_foutmelding.Text = "Eerst inloggen a.u.b!";
        lbl_foutmelding.Visible = !swap;
    }


    protected void btn_boek_vlucht_Click(object sender, EventArgs e)
    {
        // Indien alle data aanwezig is en de gebruiker voldoende saldo heeft,
        // de gegevens invoeren in de database.
        if (Request.Cookies["InHollandAir"] != null)
        {
            try
            {
                Vlucht v = (Vlucht)Session["heenVlucht"];
                if (ConnectDB._Connection.State == ConnectionState.Open)
                    ConnectDB._Connection.Close();
                ConnectDB._Connection.Open();
                SqlCommand InsertVlucht = new SqlCommand(sp.setVlucht, ConnectDB._Connection);
                InsertVlucht.CommandType = CommandType.StoredProcedure;

                SqlParameter vluchtNummer = InsertVlucht.Parameters.Add("@vluchtnummer", SqlDbType.Int);
                SqlParameter klantNummer = InsertVlucht.Parameters.Add("@klantnummer", SqlDbType.Int);
                SqlParameter luchthavenNummer = InsertVlucht.Parameters.Add("@luchthavennummer", SqlDbType.Int);
                SqlParameter bestemmingNummer = InsertVlucht.Parameters.Add("@bestemmingnummer", SqlDbType.Int);
                SqlParameter prijs = InsertVlucht.Parameters.Add("@prijs", SqlDbType.Int);
                SqlParameter aantalPersonen = InsertVlucht.Parameters.Add("@aantalpersonen", SqlDbType.Int);
                SqlParameter vertrekTijd = InsertVlucht.Parameters.Add("@vertrektijd", SqlDbType.DateTime);
                SqlParameter boekingsTijd = InsertVlucht.Parameters.Add("@boekingstijd", SqlDbType.DateTime);
                SqlParameter retourTijd = InsertVlucht.Parameters.Add("@retourtijd", SqlDbType.DateTime);
                SqlParameter miles = InsertVlucht.Parameters.Add("@miles", SqlDbType.Int);

                DateTime vertrektijd = getDate(v.DatumVertrek.Day.ToString() + "-" + v.DatumVertrek.Month.ToString() + "-" + v.DatumVertrek.Year.ToString() + " " + v.TijdVluchtHeen.ToString().Trim());

                klantNummer.Value = klantNr;
                luchthavenNummer.Value = luchthavenNr;
                bestemmingNummer.Value = bestemmingNr;
                vluchtNummer.Value = vluchtNr;
                boekingsTijd.Value = DateTime.Now;
                prijs.Value = kosten;
                aantalPersonen.Value = v.AantalPersonen;
                vertrekTijd.Value = vertrektijd;
                miles.Value = beschikbareMiles - kosten;
                  // extra check voor retourvluchten
                if (Session["retourVlucht"] != null)
                {
                    Vlucht rv = (Vlucht)Session["retourVlucht"];
                    DateTime retourtijd = getDate(rv.DatumVertrek.Day.ToString() + "-" + rv.DatumVertrek.Month.ToString() + "-" + rv.DatumVertrek.Year.ToString() + " " + rv.TijdVluchtHeen.ToString().Trim());
                    retourTijd.Value = retourtijd;
                }
                else
                {
                    DateTime emptyretour = new DateTime(1800, 1, 1, 0, 0, 0);
                    retourTijd.Value = emptyretour;
                }
                InsertVlucht.ExecuteNonQuery();
                Response.Redirect("BevestigingBestelling.aspx");
            }
            catch (SqlException ex)
            {
                lbl_foutmelding.Text = Fout.databaseOffline;
                LogError.writeToLogFile(ex.Message);
            }
            finally
            {
                ConnectDB._Connection.Close();
            }
                
        }
            // Doorsturen naar database bij ontbreken Cookie
        else
        {
            Session["HTTP_Referer"] = Request.ServerVariables["HTTP_Referer"];
            Response.Redirect("Login.aspx");
        }


    }

    // String to DateTime parser
    private DateTime getDate(string input)
    {
        DateTime date = new DateTime();
        DateTime.TryParseExact(input, "dd-MM-yyyy hh:mm", CultureInfo.CurrentCulture, DateTimeStyles.None, out date);
        DateTime.TryParseExact(input, "d-MM-yyyy hh:mm", CultureInfo.CurrentCulture, DateTimeStyles.None, out date);
        DateTime.TryParseExact(input, "dd-M-yyyy hh:mm", CultureInfo.CurrentCulture, DateTimeStyles.None, out date);
        DateTime.TryParseExact(input, "d-M-yyyy hh:mm", CultureInfo.CurrentCulture, DateTimeStyles.None, out date);
        return date;

    }

    // Tonen van de heenreis gegevens
    public void laadHeenVluchtGegevens(Vlucht v)
    {
        lbl_vertrek.Text = v.PlaatsVertrek;
        lbl_bestemming.Text = v.PlaatsBestemming;
        lbl_datum.Text = v.DatumVertrek.Day + "/" + v.DatumVertrek.Month + "/" + v.DatumVertrek.Year;
        lbl_tijd.Text = v.TijdVluchtHeen;
        lbl_aantal_personen.Text = v.AantalPersonen.ToString();

    }

    private SqlCommand cmd;
    private SqlDataReader reader;
    public void voerAantalMilesIn()
    {

        try
        {
            Vlucht v = (Vlucht)Session["heenVlucht"];
            // Corrosponderende vluchtnummer opzoeken bij de locaties
            luchthavenNr = getLuchthavenNr(v.PlaatsVertrek, sp.getVertrekLocatieNummer);
            bestemmingNr = getLuchthavenNr(v.PlaatsBestemming, sp.getBestemmingLocatieNummer);

            cmd = new SqlCommand(sp.getPrijs, ConnectDB._Connection);
            cmd.CommandType = CommandType.StoredProcedure;

            SqlParameter LuchthavenNr = cmd.Parameters.Add("@LuchthavenNummer", SqlDbType.VarChar);
            SqlParameter BestemmingNr = cmd.Parameters.Add("@BestemmingNummer", SqlDbType.VarChar);

            LuchthavenNr.Value = luchthavenNr;
            BestemmingNr.Value = bestemmingNr;
            if (ConnectDB._Connection.State == ConnectionState.Open)
                ConnectDB._Connection.Close();
            ConnectDB._Connection.Open();
            reader = cmd.ExecuteReader();
            printKosten(v.AantalPersonen);
        }
        catch (SqlException e)
        {
            lbl_foutmelding.Text += "Fout bij het laden van de pagina";
            LogError.writeToLogFile(e.Message);
        }

        finally
        {
            ConnectDB._Connection.Close(); 
            reader.Close();
        }
    }

    // Deze functie returned het luchthaven a.d.h.v. luchthavennaam
    private int getLuchthavenNr(string luchthaven, string query)
    {
        int luchthavenNummer = 0;

        cmd = new SqlCommand(query, ConnectDB._Connection);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter LuchthavenNaam = cmd.Parameters.Add("@LuchthavenNaam", SqlDbType.VarChar);
        LuchthavenNaam.Value = luchthaven;
        try
        {
            ConnectDB._Connection.Open();
            reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    luchthavenNummer = reader.GetInt32(i);
                }
            }
        }
        catch (SqlException ex)
        {
            LogError.writeToLogFile(ex.Message);
        }
        finally
        {
            ConnectDB._Connection.Close();
        }
        return luchthavenNummer;
    }
    
    public void printKosten(int aantalPersonen)
    {
        // Kosten voor de vlucht uitlezen, vermenigvuldigen met het aantal personen
        // en eventueel verdubbelen indien retour
        while (reader.Read())
        {
            vluchtNr = int.Parse(reader["VluchtNummer"].ToString());
            kosten = (int.Parse(reader["InHollandMiles"].ToString()) * aantalPersonen);
        }

        if (Session["retourVlucht"] != null)
            kosten = kosten * 2;

        lbl_kosten_miles.Text = kosten.ToString();
        checkKosten();
    }

    private void checkKosten()
    {
        // Controlleren of de gebruiker voldoende saldo heeft,
        // indien onvoldoende, melding geven en bestelknop disabelen.
        if (lbl_beschikbare_miles.Text != "-" && lbl_kosten_miles.Text != "-")
        {
            if (int.Parse(lbl_beschikbare_miles.Text) >= int.Parse(lbl_kosten_miles.Text))
            {
                lbl_foutmelding.Visible = false;
                btn_boek_vlucht.Enabled = true;
            }
            else
            {
                lbl_foutmelding.Visible = true;
                lbl_foutmelding.Text = "Onvoldoende saldo!";
                btn_boek_vlucht.Enabled = false;
            }
        }
    }
}